package com.note.feng.leetcode.algorithms.easy.seven;

public class SevenHundredSixtyTwo {
    /**
     * 762 二进制表示中质数个计算置位
     * 给你两个整数 left 和 right ，在闭区间 [left, right] 范围内，统计并返回 计算置位位数为质数 的整数个数。
     *
     * 计算置位位数 就是二进制表示中 1 的个数。
     *
     * 例如， 21 的二进制表示 10101 有 3 个计算置位。
     *
     * 示例 1：
     *
     * 输入：left = 6, right = 10
     * 输出：4
     * 解释：
     * 6 -> 110 (2 个计算置位，2 是质数)
     * 7 -> 111 (3 个计算置位，3 是质数)
     * 9 -> 1001 (2 个计算置位，2 是质数)
     * 10-> 1010 (2 个计算置位，2 是质数)
     * 共计 4 个计算置位为质数的数字。
     * 示例 2：
     *
     * 输入：left = 10, right = 15
     * 输出：5
     * 解释：
     * 10 -> 1010 (2 个计算置位, 2 是质数)
     * 11 -> 1011 (3 个计算置位, 3 是质数)
     * 12 -> 1100 (2 个计算置位, 2 是质数)
     * 13 -> 1101 (3 个计算置位, 3 是质数)
     * 14 -> 1110 (3 个计算置位, 3 是质数)
     * 15 -> 1111 (4 个计算置位, 4 不是质数)
     * 共计 5 个计算置位为质数的数字。
     *
     * 提示：
     *
     * 1 <= left <= right <= 106
     * 0 <= right - left <= 104
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/prime-number-of-set-bits-in-binary-representation
     */
    /**
     * 解法：数学
     * Integer.bitCount(x) 函数返回当前参数转为二进制后 1 的个数
     * 利用函数计算出 int 数字转二进制后 1 的个数，再判断个数是否是质数
     * @param left
     * @param right
     * @return
     */
    public int countPrimeSetBits(int left, int right) {
        int res = 0;
        for (int i = left; i <= right; i++) {
            if(isPrime(Integer.bitCount(i))){
                res ++;
            }
        }
        return res;
    }

    private boolean isPrime(int x){
        if(x < 2){
            return false;
        }
        for (int i = 2; i * i <= x; i++) {
            if(x % i == 0){
                return false;
            }
        }
        return true;
    }
}
